package com.example.aigc_education.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.aigc_education.domain.Course;
import com.example.aigc_education.domain.UserCourse;
import com.example.aigc_education.domain.po.SelectCourseByStuPO;
import com.example.aigc_education.mapper.CourseMapper;
import com.example.aigc_education.mapper.UserMapper;
import com.example.aigc_education.service.UserCourseService;
import com.example.aigc_education.mapper.UserCourseMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
* @author 23918
* @description 针对表【stu_user_course】的数据库操作Service实现
* @createDate 2024-05-29 22:26:06
*/
@Service
public class UserCourseServiceImpl extends ServiceImpl<UserCourseMapper, UserCourse> implements UserCourseService{

    @Resource
    private CourseMapper courseMapper;
    @Resource
    private UserMapper userMapper;


    /**
     *  添加用户与课程之间的关联信息
     * @param userId        用户id
     * @param courseId      课表id
     */
    public UserCourse addUserCourseId(Long userId, String courseId){
        UserCourse userCourse = new UserCourse();

        // 赋值UserCourse实体类
        userCourse.setUserId(userId);
        userCourse.setCourseId(courseId);

        // 使用自带的保存数据到数据库里面
        this.save(userCourse);

        return userCourse;
    }


    /**
     *  根据课表的id来删除用户与课表关联的课表信息
     * @param courseId      课表id
     */
    @Override
    public void deleteUserCourseByCourseId(String courseId) {
        // 查询构造器，查询课表id信息
        LambdaQueryWrapper<UserCourse> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(UserCourse::getCourseId, courseId);

        // 删除关联的信息
        this.remove(queryWrapper);
    }


    /**
     *  查找当前用户的所有课程id，并返回
     * @param userId    指定用户id
     * @return          返回id集合
     *
     *  此方法是配合课程查询使用
     */
    @Override
    public List<String> selectAllCourseIdByUserId(Long userId) {

        // 根据用户id查询user_course对象
        LambdaQueryWrapper<UserCourse> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(UserCourse::getUserId, userId);
        List<UserCourse> userCourseList = this.list(queryWrapper);

        // lambda简化代码————返回course_id集合
        return userCourseList.stream().map(UserCourse::getCourseId).collect(Collectors.toList());
    }


    /**
     * 根据用户ID选择对应的课程名称列表。
     *
     * @param userId 用户的ID，用于查询用户信息。
     * @return 如果用户是班主任，则返回null；否则返回用户所教授的课程名称列表。
     *
     * 此方法首先根据用户ID查询用户信息，然后根据用户所在的班级ID判断用户是否是班主任。
     * 如果用户是班主任，则不返回任何课程名称；如果用户是科任老师，则查询并返回用户教授的课程名称列表。
     */
/*    @Override
    public List<String> selectCourseNameByUserId(Long userId){
        // 创建查询包装器，用于查询用户信息
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        // 根据用户ID设置查询条件
        wrapper.eq("user_id", userId);
        // 根据查询条件查询并获取用户信息
        User user = userMapper.selectOne(wrapper);
        // 获取用户的班级ID
        String className  = user.getClassName();
        // 判断用户是否是班主任，如果是则返回null
        if (className != null || className != ""){
            //如果是班主任
            return null;
        }else {
            // 如果用户不是班主任，查询并返回用户所教授的课程名称列表
            //如果是科任老师,返回执教科目列表
            List<String> courseList = courseMapper.selectCourseNameByUserId(userId);
            return courseList;
        }
    }*/
    /**
     * 根据课程ID或班级ID查询选课学生列表。
     * 此方法用于教师查看其所授课程或班级的选课学生名单。
     * 如果提供了课程ID(认定为任课教师)，则查询该课程的选课学生；
     * 如果未提供课程ID(认定为班主任)，则查询学生所属班级的选课学生。
     *
     * @param courseId 课程ID，可为null。如果提供，将根据课程查询学生。
     * @param userId 教师的用户ID，用于确定教师的课程或班级。
     * @return 返回选课学生的列表，这些学生要么选了指定的课程，要么属于指定教师的班级。
     */
/*    @Override
    public List<SelectStuByTeacherPO> selectStuList(Long courseId, Long userId) {
        // 如果提供了课程ID，则根据课程ID查询选课学生
        if (courseId != null) {
            List<SelectStuByTeacherPO> users = userMapper.selectByCourseId(courseId, userId);
            return users;
        } else {
            User user = userMapper.selectById(userId);
            String faulty = user.getFaculty();
            String major = user.getMajor();
            String className = user.getClassName();
            // 根据班级信息查询该班学生
            List<SelectStuByTeacherPO> users = userMapper.selectByClassInfo(faulty,major,className,userId);


            return users;
        }
    }*/


    /**
     * 根据学生ID查询学生的选课信息。
     * <p>
     * 本方法通过调用courseMapper的selectCourseByUserId方法，根据学生ID获取该学生选修的课程详情。
     * 这里的学生ID是唯一标识一个学生的关键字段，选课信息包括课程的详细数据。
     * </p>
     * @param userId 学生的唯一标识ID。作为查询选课信息的依据。
     * @return 返回一个SelectCourseByStuPO对象的列表，包含该学生选修的所有课程信息。
     */
    @Override
    public List<SelectCourseByStuPO> selectStuCourse(Long userId){
        // 调用courseMapper的selectCourseByUserId方法，查询并返回学生选课详情
        // 调用courseMapper的selectCourseNameByUserId方法，查询并返回用户选课结果
        return courseMapper.selectCourseByUserId(userId);
    }

    /**
     * 查询所有课程信息
     *
     * 本方法通过调用courseMapper的selectList方法，返回所有课程的数据列表。
     * 这里的null参数表示不使用特定的条件查询，即查询所有课程。
     *
     * @return List<Course> 返回一个课程列表，包含所有课程的信息。
     */
    @Override
    public List<Course> selectAllCourse(){
        return courseMapper.selectList(null);
    }

}




